﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Text;
using WcfServices.ServiceInterfaces;
using WcfServices.Utilities;
using BLL;
using System.Drawing;
using EntitiesLayer;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Net;


namespace WcfServices
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class AutenticacionService : IAutenticacionService
    {

        private GestorProcesos gestor;

        public AutenticacionService() {

            gestor = new GestorProcesos();
        
        }

        public string IniciarSesion(Stream json)
        {

            IDictionary<string, string> dic = json.DeserializeJson<Dictionary<string, string>>();

            Usuario usuario = Util.interceptWithReturn(() => gestor.IniciarSeccionDeUna(dic["Usuario"],dic["Clave"]));

            Type[] ingnoreTypes =  { 
                                      typeof(IList<>), 
                                      typeof(Bitmap), 
                                      typeof(bool),
                                      typeof(Genero),
                                      typeof(EstadoUsuario)
                                  };


            if (usuario != null)
            {

                IList<Telefono> telefonos = usuario.ListaTelefono;
                IList<CorreoElectronico> correos = usuario.ListaCorreo;

                JObject jusuario = JObject.Parse(usuario.JsonSerialize(ignoreTypes: ingnoreTypes));

                Func<object, JToken> fromO = JToken.FromObject;

                jusuario.Add("Telefono", (telefonos != null) ? fromO(telefonos.Last().NumeroTelefono) : fromO(""));

                jusuario.Add("Correo", (correos != null) ? fromO(correos.Last().Correo) : fromO(""));

                // jusuario.Add("TipoImagen", (usuario.Foto != null) ? fromO(usuario.Foto.GetImageFormat()) : fromO(""));

                return jusuario.ToString(Formatting.None);

            }

            return "";
        }


        public string EsPermitidoPorIdUsuario(int idDerecho, int idUsuario)
        {
            bool esPermitido = gestor.esPermitidoPorIdUsuario(idUsuario, idDerecho);
            JObject puede = new JObject();
            puede.Add("Puede", JToken.FromObject(esPermitido));

            return puede.ToString(Formatting.None); 

        }

        public string EsPermitidoPorIdRol(int idDerecho, int idRol)
        {
            bool esPermitido = gestor.esPermitidoPorIdRol(idRol, idDerecho);
            JObject puede = new JObject();
            puede.Add("Puede", JToken.FromObject(esPermitido));

            return puede.ToString(Formatting.None); 
        }

        public void cambiarContrasena(Stream json)
        {
           
            IDictionary<string, string> dic = json.DeserializeJson<Dictionary<string, string>>();
            if (!gestor.CambiarContraseña(dic["OldClave"], dic["NuevaClave"]))
            {
                //412
                WebOperationContext contexto = WebOperationContext.Current;
                contexto.OutgoingResponse.StatusCode = HttpStatusCode.PreconditionFailed;
            }


        }

        public void cerrarSession() {

            gestor.CerrarSesion();
        }


   
    }
}
